iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0

今天來聊聊Delegate

Delegation是一種設計模式,他讓class某部分的責任能夠交給或委任給另一個實例化的class

Delegate在ios開發裡面是相當普遍的,delegate是在發生事件時會去通知對象的模式,發生事件的取決於上下文。像是當使用者點擊row的時候TableView的delegate會得到通知。或者當使用者在View Controller之間移動,navigation的controller的delegate會收到通知

當同意去委任某物件時,通常都須遵守某些協議。像是TableViewDelegate。 這些protocol通常會有些你可以應用的method。像是當使用者deselect a row時Table View會被通知。這些protocol通常也有些必須實現的method。

現實生活中的委任

想像我們是個為了活動提供餅乾的團隊,你負責烤餅乾,而委任我去製作麵團。一旦我完成麵團就會給你,接著你就可以使用麵團去烤餅乾

這邊有幾個重點

  • 你委任我去製作麵團
  • 也能說製作餅乾是你的責任,但你將責任交給我
  • 這裡完成兩件事。一旦我完成麵團,並且交給你,我就完成委任

這邊也有點像程式開發。一個class將任務委任給另一個物件,同時也將職責轉交給物件。

Simple Example

定義一個Cookie的struct

struct Cookie {
    var size:Int = 5
    var hasChocolateChips:Bool = false
}

再來定義一個class叫做Bakery

class Bakery
{
    func makeCookie()
    {
        var cookie = Cookie()
        cookie.size = 6
        cookie.hasChocolateChips = true
    }
}

Bakery的class有一個function叫做makeCookie()製造Cookie的struct物件然後設定一些屬性

我們有三種想要販售餅乾的方式

  • 在餅乾店內
  • 在網站上
  • 餅乾的批發商

提供餅乾是烘焙坊的責任,而銷售餅乾不是。所以我們要將提供餅乾的程式碼放進Bakery的class,這時候就需要用到Delegation。

首先將我們要轉移的責任定義一個protocol

protocol BakeryDelegate {
    func cookieWasBaked(_ cookie: Cookie)
}

BakeryDelegate的protocol定義了一個cookieWasBaked的function。

這個delgate的function在餅乾被烘烤時被呼叫,接著我們要加上delegation到Bakery的class

class Bakery
{
    var delegate:BakeryDelegate?

    func makeCookie()
    {
        var cookie = Cookie()
        cookie.size = 6
        cookie.hasChocolateChips = true

        delegate?.cookieWasBaked(cookie)
    }
}

在Bakery的class有兩件式被改變。設一個delegate的變數型態是BakeryDelegate。makeCookie()function裡呼叫cookieWasBaked

  • delegate的type就是之前我們定義的protocol,只要他符合BakeryDelegate的協議,就可以指派給任何叫做delegate的property。
  • 變數delegate是optional,當我們呼叫cookieWasBaked這個function的時候就會開始執行。

現在定義了BakeryDelegate這個protocol,也委任了Bakery的delegate,然後再makeCookie中實現了交接。

再來再建立一個delegate的class

class CookieShop: BakeryDelegate
{
    func cookieWasBaked(_ cookie: Cookie)
    {
        print("Yay! A new cookie was baked, with size \(cookie.size)")
    }
}

CookieShop採用了BakeryDelegate的protocol,也實現了cookieWasBaked的function

最後再新增以下的code

let shop = CookieShop()
let bakery = Bakery()

bakery.delegate = shop

bakery.makeCookie()

// Output: Yay! A new cookie was baked, with size 6

以上做了幾件事情

  • 首先,設定了一個常數shop是CookieShop的object
  • 再來,設定了一個bakery是Bakery object的常數
  • 指派bakery.delegate給shop,如此一來。bakery委任了shop
  • 最後當bakery做了cookie,cookie就會被轉交給商店,最後就會賣到客戶手上。

這就是delegation。bakery delegate賣餅乾給shop,每一次製作完成都就交付餅乾

delegation就是bakery不用知道cookies最後會到哪裡,每個遵從BakeryDelegate的protocol都會提供給他們。

bakery不需要知道誰實行protocol,只需要知道在它需要的時候呼叫cookieWasBaked()。


上一篇
Swift-Stack View
下一篇
Swift-Delegate(2)
系列文
Swift!從新手到微上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言